昨天有提到Containcer會去作為Servlet和web application的橋樑
Servlet最常使用的部分為
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("Longin.jsp").forward(request, response);
}
HttpServletRequest request, HttpServletResponse response
這部分就是servlet取得由Container所建立的的request&response
只是在這個練習裡,將本來由response所呈現的頁面
改由request觸發我們的JSP程式去執行
至於Container如何去和servlet去做對應
這裡就要整理一下web.xml
也就是部屬描述檔(Deployment Descriptor,簡稱DD)
Container藉由這個DD來得知如何去執行servlet及JSP
了解web.xml
看前面例子的xml檔,主要分成兩個部分
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
首先上面servlet的部分,主要是定義servlet,告訴container這支servlet要去啟動哪一支程式
所以當container看到LoginServlet得時候,因為DD有設定了
就會去執行在com/servlet/這個package下的LoginServlet.class
再來下半部Servlet-mapping的部分
主要是告訴container要根據怎樣URL去呼叫哪一支servlet
因這裡將URL-pattern設定為/
表示不管怎樣都會呼叫到loginServlet
localhost:8080/MyFirstServlet/@%@#%# --> 不管後面接什麼都會呼叫到loginServlet
如果用eclipse新增一支servlet,若帶default的話
會發現在servlet會出現webservlet annotation的語法
@WebServlet("/LoginServlet")
這也代表URL上如果有出現自己定義的名稱,就會呼叫這支servlet
另外,就完整的寫法如下:
@WebServlet(name = "LoginServlet", urlPatterns = {
"/LoginServlet", "/abc", loadOnStartup = 0
})
urlPatterns可以指向多個,也就是說照上面的寫法
localhost:8080/MyFirstServlet/LoginServlet
或是localhost:8080/MyFirstServlet/abc都會呼叫到LoginServlet這支servlet
另外loadOnStartup表示的則是載入的順序
分別由小到大,若為負數則container會依照時機去載入
此外在這裡順序性也有關係
記得沒錯的話是由上面到下面依序執行的
如果同時在DD裡面有設定,又在servlet宣告
則container會根據DD --> WebServlet 的順序去執行
如果不要讓container去抓WebServlet的值
可以在web.xml(DD)的設定增加以下設定
metadata-complete="true"
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0" metadata-complete="true">
如此一來只會去抓web.xml裡面的設定(這個值defautl是false)
回來到前面的練習
因為在DD裡面設定url-pattern為/
所以不管URL後面接什麼,DD都會去執行LoginServlet
DD除了將URL導到實際的servlet
還有其他的功用:
MVC主要是將商業邏輯和呈現結果分開
讓商業邏輯獨立出來有辦法重複使用(reusable)
在servlet和JSP的MVC架構對應如下圖